﻿/**	\file		probe.h
 *	\date		(2014-09-16 23:02:27)/(2014-11-24 14:58:19)
 *-----------------------------------------------------------------------------
 *	\version	1.0.0.1
 *	\author		Nick Shallery	(nicknide@gmail.com)
 *	\copyright	YOU HAVE ALL LEFT WITH THIS CODE WHILE YOU KEEP COMMENT IN EVERY COPY.
 *-----------------------------------------------------------------------------
**/

#if			!defined(__LOLIX__TRIAL__PROBE__NICK__K_IN_G__)
#define		__LOLIX__TRIAL__PROBE__NICK__K_IN_G__


#if			!defined(__LOLIX__LOLIX_TYPE__K_IN_G__)
	#include	"../lolix/lolix_type.h"
#endif	//	!defined(__LOLIX__LOLIX_TYPE__K_IN_G__)

#include	<stdarg.h>

namespace lxtrial
{
	/**
	 * \class	probe
	 * \brief	与用例打交道的一个探针，由需要分析的外部对象创建.
	**/
	class LOLIX_NO_VTABLE probe
		: public lolix::itf
	{
		LOLIX_DECLARE_ITF(lxtrial::probe, lolix::itf, (0xf2e5a2e1, 0x261844e6, 0x93c27e6c, 0xb96837c7));
		enum ENUM_OUT_TYPE
		{
			OUT_TYPE_INFO,	//	常规信息输出
			OUT_TYPE_WARN,	//	警告信息输出
			OUT_TYPE_ERRO,	//	错误信息输出
			OUT_TYPE_ECPT,	//	异常信息输出
			_OUT_TYPE_SIZE,
		};

		/**
		 * \fn	void probe::progress(lolix::size_type total_step);
		 *
		 * \brief	初始化设置.
		 *
		 * \param	total_step	当前进度总共有多少步.
		**/
		LOLIX_INTERFACE(progress, void, (lolix::size_type total_step));

		/**
		 * \brief	设置当前的进度为多少.
		 *
		 * \param	cur_progress	当前的进度.
		 *
		 * \return	返回当前的进度
		**/
		LOLIX_INTERFACE(set_progress, lolix::size_type, (lolix::size_type cur_progress));

		/**
		 * \brief	得到当前进度.
		 * \return	返回当前的进度
		**/
		LOLIX_INTERFACE(get_progress, lolix::size_type, (void)const);

		/**
		 * \fn	lolix::size_type probe::add_progress(lolix::size_type add_step);
		 *
		 * \brief	增加进度.
		 *
		 * \param	add_step	需要追加多少进度.
		 * \return	返回追加过后新的进度
		**/
		LOLIX_INTERFACE(add_progress, lolix::size_type, (lolix::size_type add_step));

		/**
		* \brief	向外部输出当前的数据.
		*
		* \param	type 输出的类型.
		* \param	fmt	输出格式.
		* \param	lt	当前的参数列表.
		**/
		LOLIX_INTERFACE(output, void, (ENUM_OUT_TYPE type, lolix::lx_char const* fmt, va_list lt));

		/**
		 * \brief	向外部输出当前的数据.
		 *
		 * \param	type 输出的类型.
		 * \param	fmt	输出格式.
		 * \param	lt	当前的参数列表.
		**/
		LOLIX_INTERFACE(output, void, (ENUM_OUT_TYPE type, lolix::lx_wchar const* fmt, va_list lt));

		/**
		 * \fn	lolix::size_type probe::inc_progress(void)
		 *
		 * \brief	Increment progress.
		 *
		 * \return	进度增加后新的进度值.
		**/
		LOLIX_INLINE_CALL lolix::size_type inc_progress(void)
		{
			return add_progress(1);
		}

		/**
		 * \fn void probe::output(lolix::lx_wchar const* fmt, ...)
		 *
		 * \brief	Outputs the given format.
		 *
		 * \param	fmt	Describes the format to use.
		**/
		template<typename _TChar>
		LOLIX_INLINE_CALL void output(_TChar const* fmt, ...)
		{
			va_list va;
			va_start(va, fmt);
			this->output(OUT_TYPE_INFO, fmt, va);
			va_end(va);
		}

		/**
		 * \fn	void output(ENUM_OUT_TYPE type, lolix::lx_wchar const* fmt, ...)
		 *
		 * \brief	output trace info.
		 *
		 * \param	type	output type.
		 * \param	fmt 	Describes the format to use.
		**/
		template<typename _TChar>
		LOLIX_INLINE_CALL void output(ENUM_OUT_TYPE type, _TChar const* fmt, ...)
		{
			va_list va;
			va_start(va, fmt);
			this->output(type, fmt, va);
			va_end(va);
		}
	};
}

#endif	//	!defined(__LOLIX__TRIAL__PROBE__NICK__K_IN_G__)
